template <int Rows, int Cols>
struct fsize_mat_vec_mult_reg{
template <typename Matrix, typename VecIn, typename VecOut>
void operator()(const Matrix& A, const VecIn& v_in, VecOut& v_out){
fsize_mat_vec_mult_reg<Rows-1, Cols>()(A, v_in, v_out);
typename VecOut::value_type tmp;
fsize_mat_vec_mult_aux<Rows, COls>()(A, v_in, tmp);
v_out[Rows]=tmp;
}
};
template <int Cols>
struct fsize_mat_vec_mult_reg<0, Cols>{
template <typename Matrix, typename VecIn, typename VecOut>
void operator()(const Matrix& A, const VecIn& v_in, VecOut& v_out){
typename VecOut::value_type tmp;
fsize_mat_vec_mult_aux<0, Cols>()(A, v_in, tmp);
v_out[0]=tmp;
}
};
template <int Rows, int Cols>
struct fsize_mat_vec_mult_aux{
template <typename Matrix, typename VecIn, typename ScalOut>
void operator()(const Matrix& A, const VecIn& v_in, ScalOut& tmp){
fsize_mat_vec_mult_aux<Row, Cols-1>()(A, v_in, tmp);
tmp+=A[Rows][Cols]*v_in[Cols];
}
};
template <int Rows>
struct fsize_mat_vec_mult_aux<Rows, 0>{
template <typename Matrix, typename VecIn, typename ScalOut>
void operator()(const Matrix& A, const VecIn& v_in, ScalOut& tmp){
tmp=A[Rows][0]*v_in[0];
}
};